import {AsyncStorage} from 'react-native'

export const FAVORITE_KEY_PREFIX = 'favorite_'

export default class FavoriteDao {
    constructor(flag) {
        this.favoriteKey = FAVORITE_KEY_PREFIX + flag
    }

    /**
     * 收藏项目,保存收藏的项目
     * @param key 项目ID
     * @param value
     * @param callBack
     */
    saveFavoriteItem(key, value, callBack) {
        AsyncStorage.setItem(key, value, (error, res) => {
            if (!error) {
                this.updateFavoriteKeys(key, true)
            }
        })
    }

    /**
     * 更新FavoriteKeys集合
     * @param key // 项目ID
     * @param isAdd true: 新增; false: 删除
     */
    updateFavoriteKeys(key, isAdd) {
        AsyncStorage.getItem(this.favoriteKey, (error, result) => {
            let favoriteKeys = []
            if (!error) {
                if (result) {
                    favoriteKeys = JSON.parse(result)
                }
                let index = favoriteKeys.indexOf(key)
                if (isAdd) { // 新增收藏，将key添加到favoriteKey中
                    if (index === -1) {
                        favoriteKeys.push(key)
                    }
                    AsyncStorage.setItem(this.favoriteKey, JSON.stringify(favoriteKeys))
                } else { //删除,即将key从favoriteKeys移除
                    if (index !== -1) {
                        favoriteKeys.splice(index, 1)
                    }
                    AsyncStorage.setItem(this.favoriteKey, JSON.stringify(favoriteKeys))
                }
            }
        })
    }

    /**
     * 获取对应Flag的FavoriteKeys集合
     * @return {Promise<any> | Promise}
     */
    getFavoriteKeys() {
        return new Promise((resolve, reject) => {
            AsyncStorage.getItem(this.favoriteKey, (error, result) => {
                console.log('result:::',result)
                if (!error) {
                    try {
                        result = result === null ? [] : JSON.parse(result)
                        resolve(result)
                    } catch (e) {
                        reject(e)
                    }
                } else {
                    reject(error)
                }
            })

        })
    }

    /**
     * 移除收藏的项目
     * @param key
     */
    removeFavoriteItem(key) {
        AsyncStorage.removeItem(key, (error) => {
            if (!error) {
                this.updateFavoriteKeys(key, false)
            }
        })
    }

    getAllItems() {
        return new Promise((resolve, reject) => {
            this.getFavoriteKeys()
                .then(keys => {
                    let items = []
                    if (keys.length > 0) {
                        AsyncStorage.multiGet(keys, (error, stores) => {
                            if (!error) {
                                try {
                                    stores.forEach((store, i, stores) => {
                                        let key = store[0]
                                        let value = store[1]
                                        if (value) items.push(JSON.parse(value))
                                    })
                                    resolve(items)
                                } catch (e) {
                                    reject(e)
                                }
                            } else {
                                reject(error)
                            }
                        })
                    }

                })
                .catch(error => {
                    reject(error)
                })
        })

    }
}